$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

C++
C#

Угнежђено гранање

У задацима који следе користи се угнежђено гранање (наредбе гранања су наведене унутар тела ширих наредби гранања).

Елементи програмског језика

Уколико је потребно извршити гранање на основу неколико међусобно искључујућих услова, то можемо да урадимо коришћењем конструкције else-if, која има следећи општи облик:

if (uslov1)
   naredba1
else if (uslov2)
   naredba2
else if (uslov3)
   naredba3
...
else
   naredbak

Приликом извршавања ове наредбе проверавају се редом услови uslov1, uslov2 итд. све док се не наиђе на неки услов који је испуњен и чији се блок наредби извршава. Последња else ставка се извршава ако ниједан од услова није испуњен. Тај део је опцион и не мора се навести.

Напоменимо да би на основу уобичајеног назубљивања наредби if-else кôд требало да буде назубљен на следећи начин:

  if uslov1
    naredba1
  else
    if uslov2
       naredba2
    else 
      if ...
         ...
      else
        naredbak

зато што је доња наредба if-else угнежђена у горњу if-else наредбу и део је њене else гране. Ипак, else-if конструкција се користи прилично често и назубљује на горе приказани начин да би се нагласило да су све три гране у њој равноправне.

Поменимо једну важну појаву познату као висеће else (енг. dangling else). Уколико имамо угнежђено гранање облика:

if (uslov1)
   if (uslov2)
      naredba1
else
   naredba2

поставља се питање за коју if наредбу се везује else ставка: за прву или другу? С обзиром да преводилац не може да погоди шта је програмер имао на уму, ово питање се регулише правилом које гласи: еlse ставка се везује за последњу (дакле најближу) if наредбу, те би у претходном случају исправно форматирање било:

if (uslov1)
   if (uslov2)
      naredba1
   else
      naredba2

Уколико желимо да постигнемо да се else веже за прву if наредбу, то можемо постићи увођењем витичастих заграда и одговарајућим груписањем:

if (uslov1) {
   if (uslov2)
      naredba1
}
else
   naredba2

Уколико је потребно извршити гранање на основу неких конкретних вредности можемо искористити наредбу switch-case која има наредни облик:

switch (izraz) {
   case vrednost_1:
     naredbe_1;
     break;
   case vrednost_2:
     naredbe_2;
     break;
   ...
   case vrednost_k;
     naredbe_k;
     break;
   default:
     naredbe_d;
}

Приликом извршавања ове наредбе, редом се проверава да ли је вредност израза izraz једнакa некој од наведених вредности. Уколико израз има неку од наведених вредности, извршава се наредба (или блок наредби) наведен након те вредности и након тога се излази из наредбе switch-case. Ако бисмо заборавили да наведемо ставку break онда би се извршиле све наредбе које одговарају случају за дату вредност израза и након тога све наредне наредбе (за вредности наведене након те у наредби switch-case). Последња ставка default је опциона и означава случај када израз није једнак ниједној од наведених вредности.

Ако је блок наредби које треба извршити исти за неке различите вредности које су наведене унутар наредбе switch-case, онда се оне могу груписати на следећи начин:

switch (izraz) {
   case vrednost_1: vrednost_2: vrednost_3:
     naredbe_1;
     break;
   case vrednost_4: vrednost_5:
     naredbe_2;
     break;
   default:
     naredbe_d;
}

Израз чија се вредност тестира може бити целобројног типа, али и типа bool, типа string и набројивог типа enum (о тим типовима биће више речи касније).

Угнежђено гранање

У задацима који следе користи се угнежђено гранање (наредбе гранања су наведене унутар тела ширих наредби гранања).

Елементи програмског језика

Уколико је потребно извршити гранање на основу неколико међусобно искључујућих услова, то можемо да урадимо коришћењем конструкције else-if, која има следећи општи облик:

if (uslov1)
   naredba1
else if (uslov2)
   naredba2
else if (uslov3)
   naredba3
...
else
   naredbak

Приликом извршавања ове наредбе проверавају се редом услови uslov1, uslov2 итд. све док се не наиђе на неки услов који је испуњен и чији се блок наредби извршава. Последња else ставка се извршава ако ниједан од услова није испуњен. Тај део је опцион и не мора се навести.

Напоменимо да би на основу уобичајеног назубљивања наредби if-else кôд требало да буде назубљен на следећи начин:

  if uslov1
    naredba1
  else
    if uslov2
       naredba2
    else 
      if ...
         ...
      else
        naredbak

зато што је доња наредба if-else угнежђена у горњу if-else наредбу и део је њене else гране. Ипак, else-if конструкција се користи прилично често и назубљује на горе приказани начин да би се нагласило да су све три гране у њој равноправне.

Поменимо једну важну појаву познату као висеће else (енг. dangling else). Уколико имамо угнежђено гранање облика:

if (uslov1)
   if (uslov2)
      naredba1
else
   naredba2

поставља се питање за коју if наредбу се везује else ставка: за прву или другу? С обзиром да преводилац не може да погоди шта је програмер имао на уму, ово питање се регулише правилом које гласи: еlse ставка се везује за последњу (дакле најближу) if наредбу, те би у претходном случају исправно форматирање било:

if (uslov1)
   if (uslov2)
      naredba1
   else
      naredba2

Уколико желимо да постигнемо да се else веже за прву if наредбу, то можемо постићи увођењем витичастих заграда и одговарајућим груписањем:

if (uslov1) {
   if (uslov2)
      naredba1
}
else
   naredba2

Уколико је потребно извршити гранање на основу неких конкретних вредности можемо искористити наредбу switch-case која има наредни облик:

switch (izraz) {
   case vrednost_1:
     naredbe_1;
     break;
   case vrednost_2:
     naredbe_2;
     break;
   ...
   case vrednost_k;
     naredbe_k;
     break;
   default:
     naredbe_d;
}

Приликом извршавања ове наредбе, редом се проверава да ли је вредност израза izraz једнакa некој од наведених вредности. Уколико израз има неку од наведених вредности, извршава се наредба (или блок наредби) наведен након те вредности и након тога се излази из наредбе switch-case. Ако бисмо заборавили да наведемо ставку break онда би се извршиле све наредбе које одговарају случају за дату вредност израза и након тога све наредне наредбе (за вредности наведене након те у наредби switch-case). Последња ставка default је опциона и означава случај када израз није једнак ниједној од наведених вредности.

Ако је блок наредби које треба извршити исти за неке различите вредности које су наведене унутар наредбе switch-case, онда се оне могу груписати на следећи начин:

switch (izraz) {
   case vrednost_1: vrednost_2: vrednost_3:
     naredbe_1;
     break;
   case vrednost_4: vrednost_5:
     naredbe_2;
     break;
   default:
     naredbe_d;
}

Израз чија се вредност тестира може бити целобројног типа, али и типа bool, типа string и набројивог типа enum (о тим типовима биће више речи касније).